home *** CD-ROM | disk | FTP | other *** search
- /*
- * showmount.c -- show mount information for an NFS server
- * Copyright (C) 1993 Rick Sladkey <jrs@world.std.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
- #ifdef HAVE_CONFIG_H
- #include <config.h>
- #endif
-
- #include <stdio.h>
- #include <rpc/rpc.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/time.h>
- #ifdef HAVE_STRING_H
- #include <string.h>
- #else
- #include <strings.h>
- #endif
- #include <sys/types.h>
- #ifdef STDC_HEADERS
- #include <unistd.h>
- #include <memory.h>
- #include <stdlib.h>
- #endif
-
- #include <netdb.h>
- #include <arpa/inet.h>
- #include <errno.h>
- #include "getopt.h"
-
- #include "mount.h"
-
- int headers = 1;
- int hflag = 0;
- int aflag = 0;
- int dflag = 0;
- int eflag = 0;
-
- extern char version[];
- char *program_name;
- static struct option longopts[] =
- {
- { "all", 0, 0, 'a' },
- { "directories", 0, 0, 'd' },
- { "exports", 0, 0, 'e' },
- { "no-headers", 0, &headers, 'n'},
- { "version", 0, 0, 'v' },
- { "help", 0, 0, 'h' },
- { NULL, 0, 0, 0 }
- };
-
- #define MAXHOSTLEN 256
-
- int dump_cmp(p, q)
- char **p;
- char **q;
- {
- return strcmp(*p, *q);
- }
-
- static void usage(fp, n)
- FILE *fp;
- int n;
- {
- fprintf(fp, "Usage: %s [-adehv]\n", program_name);
- fprintf(fp, " [--all] [--directories] [--exports]\n");
- fprintf(fp, " [--no-headers] [--help] [--version] [host]\n");
- exit(n);
- }
-
- int main(argc, argv)
- int argc;
- char **argv;
- {
- char hostname_buf[MAXHOSTLEN];
- char *hostname;
- enum clnt_stat clnt_stat;
- struct hostent *hp;
- struct sockaddr_in server_addr;
- int msock;
- struct timeval total_timeout;
- struct timeval pertry_timeout;
- int c;
- CLIENT *mclient;
- groups grouplist;
- exports exportlist, exl;
- mountlist dumplist;
- mountlist list;
- int i;
- int n;
- int maxlen;
- char **dumpv;
-
- program_name = argv[0];
- while ((c = getopt_long(argc, argv, "adehv", longopts, NULL)) != EOF) {
- switch (c) {
- case 'a':
- aflag = 1;
- break;
- case 'd':
- dflag = 1;
- break;
- case 'e':
- eflag = 1;
- break;
- case 'h':
- usage(stdout, 0);
- break;
- case 'v':
- printf("%s\n", version);
- exit(0);
- case 0:
- break;
- case '?':
- default:
- usage(stderr, 1);
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
- switch (aflag + dflag + eflag) {
- case 0:
- hflag = 1;
- break;
- case 1:
- break;
- default:
- fprintf(stderr, "%s: only one of -a, -d or -e is allowed\n",
- program_name);
- exit(1);
- break;
- }
-
- switch (argc) {
- case 0:
- if (gethostname(hostname_buf, MAXHOSTLEN) < 0) {
- perror("getting hostname");
- exit(1);
- }
- hostname = hostname_buf;
- break;
- case 1:
- hostname = argv[0];
- break;
- default:
- fprintf(stderr, "%s: only one hostname is allowed\n",
- program_name);
- exit(1);
- break;
- }
-
- if (hostname[0] >= '0' && hostname[0] <= '9') {
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.s_addr = inet_addr(hostname);
- }
- else {
- if ((hp = gethostbyname(hostname)) == NULL) {
- fprintf(stderr, "%s: can't get address for %s\n",
- program_name, hostname);
- exit(1);
- }
- server_addr.sin_family = AF_INET;
- memcpy(&server_addr.sin_addr, hp->h_addr, hp->h_length);
- }
-
- /* create mount deamon client */
-
- server_addr.sin_port = 0;
- msock = RPC_ANYSOCK;
- if ((mclient = clnttcp_create(&server_addr,
- MOUNTPROG, MOUNTVERS, &msock, 0, 0)) == NULL) {
- server_addr.sin_port = 0;
- msock = RPC_ANYSOCK;
- pertry_timeout.tv_sec = 3;
- pertry_timeout.tv_usec = 0;
- if ((mclient = clntudp_create(&server_addr,
- MOUNTPROG, MOUNTVERS, pertry_timeout, &msock)) == NULL) {
- clnt_pcreateerror("mount clntudp_create");
- exit(1);
- }
- }
- mclient->cl_auth = authunix_create_default();
- total_timeout.tv_sec = 20;
- total_timeout.tv_usec = 0;
-
- if (eflag) {
- memset(&exportlist, '\0', sizeof(exportlist));
- clnt_stat = clnt_call(mclient, MOUNTPROC_EXPORT,
- (xdrproc_t) xdr_void, NULL,
- (xdrproc_t) xdr_exports, &exportlist,
- total_timeout);
- if (clnt_stat != RPC_SUCCESS) {
- clnt_perror(mclient, "rpc mount export");
- exit(1);
- }
- if (headers)
- printf("Export list for %s:\n", hostname);
- maxlen = 0;
- for (exl = exportlist; exl; exl = exl->ex_next) {
- if ((n = strlen(exl->ex_dir)) > maxlen)
- maxlen = n;
- }
- while (exportlist) {
- printf("%-*s ", maxlen, exportlist->ex_dir);
- grouplist = exportlist->ex_groups;
- if (grouplist)
- while (grouplist) {
- printf("%s%s", grouplist->gr_name,
- grouplist->gr_next ? "," : "");
- grouplist = grouplist->gr_next;
- }
- else
- printf("(everyone)");
- printf("\n");
- exportlist = exportlist->ex_next;
- }
- exit(0);
- }
-
- memset(&dumplist, '\0', sizeof(dumplist));
- clnt_stat = clnt_call(mclient, MOUNTPROC_DUMP,
- (xdrproc_t) xdr_void, NULL,
- (xdrproc_t) xdr_mountlist, &dumplist,
- total_timeout);
- if (clnt_stat != RPC_SUCCESS) {
- clnt_perror(mclient, "rpc mount dump");
- exit(1);
- }
-
- n = 0;
- for (list = dumplist; list; list = list->ml_next)
- n++;
- dumpv = (char **) calloc(n, sizeof (char *));
- if (n && !dumpv) {
- fprintf(stderr, "%s: out of memory\n", program_name);
- exit(1);
- }
- i = 0;
-
- if (hflag) {
- if (headers)
- printf("Hosts on %s:\n", hostname);
- while (dumplist) {
- dumpv[i++] = dumplist->ml_hostname;
- dumplist = dumplist->ml_next;
- }
- }
- else if (aflag) {
- if (headers)
- printf("All mount points on %s:\n", hostname);
- while (dumplist) {
- char s[1024];
- char *t;
-
- sprintf(s, "%s:%s", dumplist->ml_hostname,
- dumplist->ml_directory);
- t = malloc(strlen(s) + 1);
- if (t)
- strcpy(t, s);
- else {
- printf("%s: out of memory\n", program_name);
- exit(1);
- }
- dumpv[i++] = t;
- dumplist = dumplist->ml_next;
- }
- }
- else if (dflag) {
- if (headers)
- printf("Directories on %s:\n", hostname);
- while (dumplist) {
- dumpv[i++] = dumplist->ml_directory;
- dumplist = dumplist->ml_next;
- }
- }
-
- qsort(dumpv, n, sizeof (char *), dump_cmp);
-
- for (i = 0; i < n; i++) {
- if (i == 0 || strcmp(dumpv[i], dumpv[i - 1]) != 0)
- printf("%s\n", dumpv[i]);
- }
- exit(0);
- }
-
-